package com.fl.serivce;

import java.util.List;

import org.apache.log4j.Logger;

import com.fl.dao.ParamDao;
import com.fl.sys.SysConfig;
import com.fl.util.FtpUtil;
import com.fl.util.StringUtil;

/** 
 * <pre>
 * FTP服务类<BR>
 * <li>FTP上传，下载服务</li> <BR>
 * </pre>
 * @author Neil
 */
public class FtpService {
	private static Logger log = Logger.getLogger(FtpService.class);
	
	private String username;
	private String password;
	private String ftpserver;
	private String port;
	private static FtpUtil ftpUtil;
	
	/**
	 * 初始化FtpService，包含用户名。密码，ftp服务器地址、端口，并尝试是否可正常访问
	 * 供测试初始化实例用
	 * 
	 * @return 
	 *      true 初始化成功，false 初始化失败
	 */
	public boolean initFtpServiceManual(String user, String passwd, String ftpserver, String port) {
		log.info("FtpService initialize.");
		boolean initSuccess = false;
		try {
			//从数据库常量中取得所有ftp相关的配置信息
			this.username = user;
			this.password = passwd;
			this.ftpserver = ftpserver;
			this.port = port;
		} catch (Exception e) {
			log.error("FtpService initialize failed. Ftp's configruation can't read. "
					+ e.getMessage());
			return false;
		}
		//判断是否数据库常量有关ftp的未初始化配置，或配置记录不存在
		if (StringUtil.isBlank(username) || StringUtil.isBlank(password)
				|| StringUtil.isBlank(ftpserver) || StringUtil.isBlank(port)) {
			log.error("FtpService initialize failed. Ftp's configruation isn't right. Please check db");
			return false;
		}
		
		//尝试初始化FTPUtil工具类
		if (ftpUtil == null) {
			ftpUtil = new FtpUtil(username,password,ftpserver, port);
		}
		
		if (FtpUtil.connectServer()) {
			log.info("FtpService initialize success. connection is ok");
			initSuccess = true;
		} else {
			log.error("FtpService initialize failed. can't connect to server");
		}

		return initSuccess;
	}


	/**
	 * 判断是否用户名+密码能正常登录ftp
	 * 
	 * @param  user
	 * 				用户名
	 * @param passwd
	 * 				密码
	 * @return 
	 *      true 是有效用户，false 无效用户
	 */
	public boolean isValidUser(String user, String passwd) {
		log.info("FtpService initialize.");
		boolean initSuccess = false;
		try {
			//从数据库常量中取得所有ftp相关的配置信息
			this.username = user;
			this.password = passwd;
			this.ftpserver = ParamDao.getParamTableVal(SysConfig.FTP_SERVER);
			this.port = ParamDao.getParamTableVal(SysConfig.FTP_PORT);
		} catch (Exception e) {
			log.error("FtpService initialize failed. Ftp's configruation can't read. "
					+ e.getMessage());
			return false;
		}
		//判断是否数据库常量有关ftp的未初始化配置，或配置记录不存在
		if (StringUtil.isBlank(username) || StringUtil.isBlank(password)
				|| StringUtil.isBlank(ftpserver) || StringUtil.isBlank(port)) {
			log.error("FtpService initialize failed. Ftp's configruation isn't right. Please check db");
			return false;
		}
		
		//尝试初始化FTPUtil工具类
		if (ftpUtil == null) {
			ftpUtil = new FtpUtil(username,password,ftpserver, port);
		}
		
		if (FtpUtil.connectServer()) {
			log.info("user:" + username + " is valid");
			initSuccess = true;
		} else {
			log.error("user:" + username + " is not valid");
		}

		return initSuccess;
	}
	
	/**
	 * 初始化FtpService，包含用户名。密码，ftp服务器地址、端口，并尝试是否可正常访问
	 * 
	 * @return 
	 *      true 初始化成功，false 初始化失败
	 */
	private boolean initFtpService() {
		log.info("FtpService initialize.");
		boolean initSuccess = false;
		try {
			//从数据库常量中取得所有ftp相关的配置信息
			this.username = ParamDao.getParamTableVal(SysConfig.USER);
			this.password = ParamDao.getParamTableVal(SysConfig.PASSWD);
			this.ftpserver = ParamDao.getParamTableVal(SysConfig.FTP_SERVER);
			this.port = ParamDao.getParamTableVal(SysConfig.FTP_PORT);
		} catch (Exception e) {
			log.error("FtpService initialize failed. Ftp's configruation can't read. "
					+ e.getMessage());
			return false;
		}
		//判断是否数据库常量有关ftp的未初始化配置，或配置记录不存在
		if (StringUtil.isBlank(username) || StringUtil.isBlank(password)
				|| StringUtil.isBlank(ftpserver) || StringUtil.isBlank(port)) {
			log.error("FtpService initialize failed. Ftp's configruation isn't right. Please check db");
			return false;
		}
		
		//尝试初始化FTPUtil工具类
		if (ftpUtil == null) {
			ftpUtil = new FtpUtil(username,password,ftpserver, port);
		}
		
		if (FtpUtil.connectServer()) {
			log.info("FtpService initialize success. connection is ok");
			
		} else {
			log.error("FtpService initialize failed. can't connect to server");
		}

		return initSuccess;
	}
	
	public static boolean uploadFile() {

		return true;
	}
	
	/**
	 * 获取ftp目录中存在的文件列表
	 * 
	 * @param filePath
	 * 		    需要切换到ftp的目录，若为空则为默认目录
	 * @return 
	 * 			java.util.List 文件列表
	 */
	public static String[] getFtpFileNameList(String filePath) {
		String[] fileList = FtpUtil.getFtpFileNameList(filePath);
		return fileList;
	}
	
	
	/**
	 * 上传文件
	 * 
	 * @param localFilePath
	 *            本地文件路径及名称(例如：E:/dmp/20130101-aa.dmp)
	 * @param remoteFileName
	 *            FTP 服务器文件名称(20130101-aa.dmp)
	 * @param remoteDir
	 *            FTP 服务器目录(例如：/dmp，可不填) 如果ftp服务器text目录不存在，将会自动创建
	 * @return
	 */
	public static boolean uploadFile(String localFilePath,
			String remoteFileName, String remoteDir) {

		return FtpUtil.uploadFile(localFilePath, remoteFileName, remoteDir);

	}
	
	
	/**
	 * 下载文件(单个)
	 * 
	 * @param remoteFileName
	 *            	服务器上的文件名 (20130101-aa.dmp)
	 * @param localFileName	
	 * 				本地文件路径及文件名(E:/dmp/20130101-aa.dmp)
	 * @param remoteDir
	 * 				ftp目录（/dmp）
	 * @return
	 * 				下载到本地的文件名（E:/dmp/20130101-aa.dmp）
	 */
	public static String downloadFile(String remoteFileName, String localFileName,
			String remoteDir) {
		return FtpUtil.downloadFile(remoteFileName, localFileName, remoteDir);
	}
	
	
	/**
	 * 删除一个文件
	 * 
	 * @param remoteFileName
	 *            删除的文件名称
	 * @param remoteDir
	 *            删除文件所在服务器上的目录
	 * @return true 删除成功 false 删除失败
	 */
	public static boolean deleteFile(String remoteFileName, String remoteDir) {
		return FtpUtil.deleteFile(remoteFileName, remoteDir);
	}
	
	/**
	 * 重命名文件
	 * 
	 * @param oldFileName
	 *            	原文件名
	 * @param newFileName
	 *            	新文件名
	 */
	public static void renameFile(String oldFileName, String newFileName) {
		FtpUtil.renameFile(oldFileName, newFileName);
	}
	
	
	/**
	 * 创建一个给定的新的子目录路径是在FTP服务器上
	 * 
	 * @param dirPath
	 *            目录名称
	 * @param remoteDir
	 *            ftp目录
	 * @return 状态值 
	 * 			  true 创建成功 false 创建失败
	 */
	public static boolean makeDir(String dirPath, String remoteDir) {
		return FtpUtil.makeDir(dirPath, remoteDir);
	}
	
	/**
	 * 删除目录(及目录下所有文件和子目录)
	 * 
	 * @param path
	 *            ftp删除目录路径
	 * @return true 删除成功 false 删除失败
	 */
	public static boolean removeDirectory(String path) {
		return FtpUtil.removeDirectory(path);
	}
	
}
